Telegram Group & Telegram Channel
Создание объекта в Python включает два ключевых этапа. Сначала вызывается метод __new__, который создаёт и возвращает новый объект. Затем вызывается метод __init__ для инициализации состояния этого объекта.

Однако, если __new__ возвращает объект, который не является экземпляром исходного класса, метод __init__ не будет вызван. Это связано с тем, что возвращаемый объект, вероятно, уже создан другим классом, и его __init__ уже был выполнен:


class Foo:
def __new__(cls, x):
return dict(x=x)

def __init__(self, x):
print(x) # Никогда не вызывается

print(Foo(0))


Важно: не следует создавать экземпляры того же класса в __new__ с использованием обычного конструктора (Foo(...)). Это может привести к двойному вызову __init__ или даже к бесконечной рекурсии.

Пример бесконечной рекурсии:


class Foo:
def __new__(cls, x):
return Foo(-x) # Рекурсия


Пример двойного вызова __init__:


class Foo:
def __new__(cls, x):
if x < 0:
return Foo(-x)
return super().__new__(cls)

def __init__(self, x):
print(x)
self._x = x


Правильный способ:


class Foo:
def __new__(cls, x):
if x < 0:
return cls.__new__(cls, -x)
return super().__new__(cls)

def __init__(self, x):
print(x)
self._x = x


👉@BookPython



tg-me.com/BookPython/3639
Create:
Last Update:

Создание объекта в Python включает два ключевых этапа. Сначала вызывается метод __new__, который создаёт и возвращает новый объект. Затем вызывается метод __init__ для инициализации состояния этого объекта.

Однако, если __new__ возвращает объект, который не является экземпляром исходного класса, метод __init__ не будет вызван. Это связано с тем, что возвращаемый объект, вероятно, уже создан другим классом, и его __init__ уже был выполнен:


class Foo:
def __new__(cls, x):
return dict(x=x)

def __init__(self, x):
print(x) # Никогда не вызывается

print(Foo(0))


Важно: не следует создавать экземпляры того же класса в __new__ с использованием обычного конструктора (Foo(...)). Это может привести к двойному вызову __init__ или даже к бесконечной рекурсии.

Пример бесконечной рекурсии:


class Foo:
def __new__(cls, x):
return Foo(-x) # Рекурсия


Пример двойного вызова __init__:


class Foo:
def __new__(cls, x):
if x < 0:
return Foo(-x)
return super().__new__(cls)

def __init__(self, x):
print(x)
self._x = x


Правильный способ:


class Foo:
def __new__(cls, x):
if x < 0:
return cls.__new__(cls, -x)
return super().__new__(cls)

def __init__(self, x):
print(x)
self._x = x


👉@BookPython

BY Библиотека Python разработчика | Книги по питону


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/BookPython/3639

View MORE
Open in Telegram


Библиотека Python разработчика Telegram | DID YOU KNOW?

Date: |

Importantly, that investor viewpoint is not new. It cycles in when conditions are right (and vice versa). It also brings the ineffective warnings of an overpriced market with it.Looking toward a good 2022 stock market, there is no apparent reason to expect these issues to change.

To pay the bills, Mr. Durov is issuing investors $1 billion to $1.5 billion of company debt, with the promise of discounted equity if the company eventually goes public, the people briefed on the plans said. He has also announced plans to start selling ads in public Telegram channels as soon as later this year, as well as offering other premium services for businesses and users.

Библиотека Python разработчика from id


Telegram Библиотека Python разработчика | Книги по питону
FROM USA